package net.facelib.jni;

import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.UUID;

import com.gitee.l0km.com4j.base.Platform;
import com.gitee.l0km.com4j.base.SimpleLog;

/**
 * 设备序列号读取SDK<br>
 * @author guyadong
 *
 */
public class DeviceSerialBridge {
	static {
		try {
			System.loadLibrary("FS_GetDevicesSerial");

		} catch (Exception e) {
			SimpleLog.log(e.getMessage());
			throw new ExceptionInInitializerError(e);
		}

	}

	///////////////////////////////////
	/**
     * 获取设备加密信息
     * @param encryptionSerial [out]获取的设备加密信息
     * @param licenseKey 授权关键字
     * @return 成功(>0 加密信息长度)或错误代码(< 0)
     * @deprecated replaced by {@link #FSGetDevicesSerialMultiType(byte[], byte[], int)} with ntype=0
     */
    public static native int FSGetDevicesSerial(byte[] encryptionSerial, byte[] licenseKey);
    /**
     * 获取设备加密信息
     * @param encryptionSerial [out]获取的设备加密信息
     * @param licenseKey 授权关键字
     * @param ntype 获取设备加密信息的类型<br>
     * 					0 为默认
     * 					1 为FLASHID
     * 					2 为CPUID
     * 					3 为UUID的MD5校验码(androidId)
     * @return 成功(>0 加密信息长度)或错误代码(< 0)
     */
    public static native int FSGetDevicesSerialMultiType(byte[] encryptionSerial, byte[] licenseKey,int ntype);
    /** 
     * 返回获取到的完整的授权的硬件信息码（可能是uuid  mac  cpuid flashid）
     * 函数在FSGetDevicesSerialMultiType成功后根据需要调用，用于后台对账使用
     * @return 硬件信息码
     */
    public static native String FSGetFlashId();
    
    public static String getUUID() {
        try {
            if(Platform.isAndroid()){
            	Class<?> classBuild = Class.forName("android.os.Build$VERSION");
            	int sdk_init = (int) classBuild.getField("SDK_INT").get(null);
            	if (sdk_init >= 18) {
            		UUID wideVineUuid = new UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L);
            		Class<?> classMediaDrm = Class.forName("android.media.MediaDrm");
            		Object wvDrm = classMediaDrm.getConstructor(UUID.class).newInstance(wideVineUuid);
            		Object PROPERTY_DEVICE_UNIQUE_ID = classMediaDrm.getField("PROPERTY_DEVICE_UNIQUE_ID").get(null);
            		Method methodGetPropertyByteArray = classMediaDrm.getMethod("getPropertyByteArray",String.class);
            		byte[] wideVineId = (byte[]) methodGetPropertyByteArray.invoke(wvDrm, PROPERTY_DEVICE_UNIQUE_ID);
            		String string = Arrays.toString(wideVineId);
            		return string;
            	}
            }
        } catch (Throwable e) {
            e.printStackTrace();
        }
        return null;
    }
    
}
